function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
const dateFormat = function (date, fmt) {
    if (!date) return ''
    date = new Date(date)
    let ret
    const opt = {
        "y+": date.getFullYear().toString(),        // 年
        "Y+": date.getFullYear().toString(),        // 年
        "M+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "D+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "h+": date.getHours().toString(),           // 时
        "m+": date.getMinutes().toString(),         // 分
        "S+": date.getSeconds().toString(),         // 秒
        "s+": date.getSeconds().toString(),         // 秒
        "f+": date.getMilliseconds().toString()     // 毫秒
    }
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt)
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        }
    }
    return fmt
}

Date.prototype.format = function (args) {
    return dateFormat(this, args)
}
const view={

      init(taskList){
        taskList.forEach(task=>{
            task.startTime=new Date(task.startTime).getTime()
            task.endTime=new Date(task.endTime).getTime()
            if(!task.ifNeedRunBeforeStart){
                while(task.startTime<new Date().getTime()){
                    task.startTime=task.startTime+task.duration
                }
            }

        })
        // 按照 startTime 从小到大排序
        taskList.sort((a, b) => {
            return a.startTime - b.startTime
        });
          this.taskList=taskList
    },
    async run(){
        const taskList=this.taskList
        while(taskList.length>0){
            let curTime=new Date().getTime()
            const task=taskList.shift()
            if(curTime>task.endTime){
                console.log('任务过期'+task.name)
                continue
            }
            const wTime=task.startTime - curTime

            if(wTime>0){
                console.log(new Date(task.startTime).format('yyyy-MM-dd HH:mm:ss'),'下个任务:'+task.name)
                await delay(wTime);
            }

            curTime=new Date().getTime()
            if(curTime>=task.startTime){
                while(task.startTime<curTime){
                    task.startTime=task.startTime+task.duration
                }
                if(task.startTime<task.endTime){
                    taskList.push(task)
                    // 按照 startTime 从小到大排序
                    taskList.sort((a, b) => {
                        return a.startTime - b.startTime
                    });
                }
                console.log('执行'+task.name,new Date().format('yyyy-MM-dd HH:mm:ss'))
                await task.taskFunction()
                console.log('完成'+task.name,new Date().format('yyyy-MM-dd HH:mm:ss'))

            }

        }

    },
    async runList(taskList){
        this.init(taskList)
        await this.run()
        console.log('runList 任务完成')
    }
}

module.exports=view